using HarmonyLib;
using System.Reflection;
using UnityEngine;
using Duckov.Modding; // 引入官方ModBehaviour所在命名空间
using Duckov.Quests.Tasks;
using Duckov.Quests;
using System;
using System.Collections.Generic;
using System.Linq;

// 保持唯一命名空间
namespace KangyuPL_QuestDeathResetMod
{
    /// <summary>
    /// 玩家死亡重置击杀任务Mod
    /// 当玩家死亡时，自动重置所有未完成的击杀类任务（QuestTask_KillCount）的击杀计数
    /// </summary>
    public class ModBehaviour : Duckov.Modding.ModBehaviour
    {
        private Harmony? harmony;
        private bool isEnabled = true;

        /// <summary>
        /// 是否启用mod功能
        /// </summary>
        public bool IsEnabled
        {
            get => isEnabled;
            set
            {
                isEnabled = value;
                Debug.Log($"[QuestDeathResetMod] Mod {(isEnabled ? "启用" : "禁用")}");
            }
        }

        /// <summary>
        /// Mod初始化完成后调用
        /// </summary>
        protected void OnEnable()
        {
            Debug.Log($"[QuestDeathResetMod] Mod已加载: {info.displayName}");

            // 初始化Harmony
            harmony = new Harmony($"com.questdeathreset.{info.name}");

            // 应用Harmony补丁
            ApplyPatches();

            Debug.Log("[QuestDeathResetMod] Harmony补丁已应用");
        }

        /// <summary>
        /// Mod停用前调用
        /// </summary>
        protected void OnDisable()
        {
            // 移除Harmony补丁
            RemovePatches();

            Debug.Log("[QuestDeathResetMod] Harmony补丁已移除");
        }

        /// <summary>
        /// 应用Harmony补丁
        /// </summary>
        private void ApplyPatches()
        {
            try
            {
                // 为LevelManager.OnMainCharacterDie方法应用前缀补丁
                var originalMethod = typeof(LevelManager).GetMethod("OnMainCharacterDie",
                    BindingFlags.NonPublic | BindingFlags.Instance);

                if (originalMethod != null)
                {
                    var prefixMethod = typeof(ModBehaviour).GetMethod(nameof(OnMainCharacterDiePrefix),
                        BindingFlags.NonPublic | BindingFlags.Static);

                    harmony?.Patch(originalMethod,
                        prefix: new HarmonyMethod(prefixMethod));

                    Debug.Log("[QuestDeathResetMod] 已为OnMainCharacterDie应用前缀补丁");
                }
                else
                {
                    Debug.LogError("[QuestDeathResetMod] 未找到OnMainCharacterDie方法");
                }
            }
            catch (Exception ex)
            {
                Debug.LogError($"[QuestDeathResetMod] 应用补丁时发生错误: {ex.Message}");
            }
        }

        /// <summary>
        /// 移除Harmony补丁
        /// </summary>
        private void RemovePatches()
        {
            try
            {
                harmony?.UnpatchAll();
            }
            catch (Exception ex)
            {
                Debug.LogError($"[QuestDeathResetMod] 移除补丁时发生错误: {ex.Message}");
            }
        }

        /// <summary>
        /// OnMainCharacterDie的前缀补丁
        /// 在原始方法执行前重置击杀任务
        /// </summary>
        /// <param name="__instance">LevelManager实例</param>
        /// <param name="dmgInfo">伤害信息</param>
        private static void OnMainCharacterDiePrefix(LevelManager __instance, DamageInfo dmgInfo)
        {
            Debug.Log("[QuestDeathResetMod] 触发死亡判定");
            // 获取当前活动的QuestDeathResetMod实例
            var modInstance = FindObjectOfType<ModBehaviour>();

            if (modInstance != null && modInstance.IsEnabled)
            {
                modInstance.ResetAllKillCountTasks();
            }
            else
            {
                Debug.Log("[QuestDeathResetMod] mod 未启用");
            }
        }

        /// <summary>
        /// 重置所有未完成的击杀类任务
        /// </summary>
        private void ResetAllKillCountTasks()
        {
            if (QuestManager.Instance == null)
            {
                Debug.LogWarning("[QuestDeathResetMod] QuestManager.Instance 为空，无法重置击杀任务");
                return;
            }

            // 获取所有活跃任务
            List<Quest> activeQuests = QuestManager.Instance.ActiveQuests;
            int resetCount = 0;

            foreach (Quest quest in activeQuests)
            {
                if (quest == null || quest.Tasks == null)
                    continue;

                // 遍历任务中的所有任务项
                bool questReseted = false;
                foreach (Task task in quest.Tasks)
                {
                    if (task == null)
                        continue;

                    // 检查是否是击杀计数任务且未完成
                    if (task is QuestTask_KillCount killCountTask)
                    {
                        killCountTask.ResetKillCount(); // 调用扩展方法
                        resetCount++;
                        questReseted = true;
                    }
                }
                if (questReseted) {
                    Debug.Log($"[QuestDeathResetMod] 任务 {quest.Description} 已被重置");
                }
            }

            if (resetCount > 0)
            {
                Debug.Log($"[QuestDeathResetMod] 玩家死亡时重置了 {resetCount} 个击杀类任务的计数");
            }
            else
            {
                Debug.Log($"[QuestDeathResetMod] 没有要重置的任务");
            }
        }

        /// <summary>
        /// 手动重置所有击杀类任务（可在编辑器中调用进行测试）
        /// </summary>
        [ContextMenu("重置所有击杀任务")]
        public void ResetAllKillCountTasksManual()
        {
            ResetAllKillCountTasks();
        }

        /// <summary>
        /// 切换mod启用状态
        /// </summary>
        [ContextMenu("切换Mod状态")]
        public void ToggleModEnabled()
        {
            IsEnabled = !IsEnabled;
        }

        /// <summary>
        /// 获取mod状态信息
        /// </summary>
        /// <returns>mod状态字符串</returns>
        public string GetModStatus()
        {
            return $"QuestDeathResetMod - 状态: {(IsEnabled ? "启用" : "禁用")}, Harmony: {(harmony != null ? "已加载" : "未加载")}";
        }



    }
}
